#!/bin/sh
#
# /etc/init.d/quagga -- start/stop the Quagga routing daemons
#
# Based on debian version by Endre Hirling <endre@mail.elte.hu> and 
# Christian Hammers <ch@debian.org>.
#

### BEGIN INIT INFO
# Provides: quagga
# Required-Start: $local_fs $network $remote_fs $syslog
# Required-Stop: $local_fs $network $remote_fs $syslog
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop the Quagga routing suite
# Description: Quagga is a routing suite for IP routing protocols like 
#              BGP, OSPF, RIP and others. This script contols the main 
#              daemon "quagga" as well as the individual protocol daemons.
### END INIT INFO

# NOTE: sbin must be before bin so we get the iproute2 ip and not the
# busybox ip command. The busybox one flushes all routes instead of just
# the dynamic routes
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/sbin
D_PATH=/usr/sbin
C_PATH=/etc/quagga

# Keep zebra first and do not list watchquagga!
DAEMONS="zebra bgpd ripd ripngd ospfd ospf6d isisd"

# Print the name of the pidfile.
pidfile()
{
	echo "/var/run/quagga/$1.pid"
}

# Check if daemon is started by using the pidfile.
started()
{
	[ -e `pidfile $1` ] && kill -0 `cat \`pidfile $1\`` 2> /dev/null && return 0
	return 1
}

# Loads the config via vtysh -b if configured to do so.
vtysh_b ()
{
	# Rember, that all variables have been incremented by 1 in convert_daemon_prios()
	if [ "$vtysh_enable" = 2 -a -f $C_PATH/Quagga.conf ]; then
		/usr/bin/vtysh -b
	fi
}

# Check if the daemon is activated and if its executable and config files 
# are in place.
# params: 	daemon name
# returns:	0=ok, 1=error
check_daemon()
{
	# If the integrated config file is used the others are not checked.
	if [ -r "$C_PATH/Quagga.conf" ]; then
	  return 0
	fi 

	# check for config file		  
	if [ ! -r "$C_PATH/$1.conf" ]; then
	  return 1
	fi
	return 0
}

# Starts the server if it's not alrady running according to the pid file.
# The Quagga daemons creates the pidfile when starting.
start()
{
	if ! check_daemon $1; then echo -n " (!$1)"; return; fi
	echo -n " $1"
	start-stop-daemon \
		--start \
		--pidfile=`pidfile $1` \
		--exec "$D_PATH/$1" \
		-- \
		`eval echo "$""$1""_options"`
		
}

# Stop the daemon given in the parameter, printing its name to the terminal.
stop()
{
    if ! started "$1" ; then
	echo -n " (!$1)"
	return 0
    else
	PIDFILE=`pidfile $1`
	PID=`cat $PIDFILE 2>/dev/null`
	start-stop-daemon --stop --quiet --exec "$D_PATH/$1"
	#
	#       Now we have to wait until $DAEMON has _really_ stopped.
	#
	if test -n "$PID" && kill -0 $PID 2>/dev/null; then
	    echo -n " (waiting) ."
	    cnt=0
	    while kill -0 $PID 2>/dev/null; do
		cnt=`expr $cnt + 1`
		if [ $cnt -gt 60 ]; then
		    # Waited 120 secs now, fail.
		    echo -n "Failed.. "
		    break
		fi
		sleep 2
		echo -n "."
		done
	    fi
	echo -n " $1"
	rm -f `pidfile $1`
    fi
}

stop_all() 
{
	local daemon_list
	daemon_list=${1:-$DAEMONS}

	echo -n "Stopping Quagga daemons:"
	for daemon_name in $daemon_list; do
		stop "$daemon_name"
	done
	echo "."
}

start_all()
{
	local daemon_list
	daemon_list=${1:-$DAEMONS}

	echo -n "Starting Quagga daemons:"
	for daemon_name in $daemon_list; do
		start "$daemon_name"
	done
	echo "."
}

status_all() 
{
	local daemon_list
	daemon_list=${1:-$DAEMONS}
	res=1

	echo -n "quagga: "
	for daemon_name in $daemon_list; do
	    if started "$daemon_name" ; then
		id=`cat \`pidfile $daemon_name\``
		echo -n "$daemon_name (pid $id) "
		res=0
	    fi
	done
	if [ $res -eq 0 ]; then
	    echo "is running..."
	else
	    echo "is stopped..."
	fi
	exit $res
}

#########################################################
# 		Main program 				#
#########################################################

# Load configuration
test -f /etc/default/quagga && . /etc/default/quagga

case "$1" in
    start)
	cd $C_PATH/
	start_all $2
	vtysh_b
    	;;
	
    stop)
  	stop_all $2
	echo "Removing all routes made by zebra."
	ip route flush proto zebra
   	;;

    status)
  	status_all $2
   	;;

    restart|force-reload)
	$0 stop $2
	sleep 1
	$0 start $2
	;;

    *)
    	echo "Usage: /etc/init.d/quagga {start|stop|restart|status|force-reload} [daemon]"
	exit 1
	;;
esac

exit 0
